[linux] Delay making the VCPUOP_initialise calls until the cpu is brought up
authorChristian Limpach <Christian.Limpach@xensource.com>
Mon, 29 Jan 2007 22:43:51 +0000 (22:43 +0000)
committerChristian Limpach <Christian.Limpach@xensource.com>
Mon, 29 Jan 2007 22:43:51 +0000 (22:43 +0000)
the first time.

Signed-off-by: Christian Limpach <Christian.Limpach@xensource.com>
linux-2.6-xen-sparse/drivers/xen/core/smpboot.c

index f58b6dca2de0f6716776c964a9a82b1c80f7c327..dea4b22923e6f00ad1a26aaa0aa4aa323d553bb4 100644 (file)
@@ -48,6 +48,7 @@ cpumask_t cpu_online_map;
 EXPORT_SYMBOL(cpu_online_map);
 cpumask_t cpu_possible_map;
 EXPORT_SYMBOL(cpu_possible_map);
+static cpumask_t cpu_initialized_map;
 
 struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned;
 EXPORT_SYMBOL(cpu_data);
@@ -278,6 +279,8 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
        if (xen_smp_intr_init(0))
                BUG();
 
+       cpu_initialized_map = cpumask_of_cpu(0);
+
        /* Restrict the possible_map according to max_cpus. */
        while ((num_possible_cpus() > 1) && (num_possible_cpus() > max_cpus)) {
                for (cpu = NR_CPUS-1; !cpu_isset(cpu, cpu_possible_map); cpu--)
@@ -330,8 +333,6 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
 #else
                cpu_set(cpu, cpu_present_map);
 #endif
-
-               cpu_initialize_context(cpu);
        }
 
        init_xenbus_allowed_cpumask();
@@ -418,6 +419,11 @@ int __devinit __cpu_up(unsigned int cpu)
        if (rc)
                return rc;
 
+       if (!cpu_isset(cpu, cpu_initialized_map)) {
+               cpu_set(cpu, cpu_initialized_map);
+               cpu_initialize_context(cpu);
+       }
+
        if (num_online_cpus() == 1)
                alternatives_smp_switch(1);